HTTP பதில் பொருள்
Node.js இல் HTTP பதில் பொருள் (http.ServerResponse) உள்நாட்டில் ஒரு HTTP சேவையகத்தால் உருவாக்கப்படுகிறது, பயனரால் அல்ல. இது 'request' நிகழ்வு callback செயல்பாட்டிற்கு இரண்டாவது அளவுருவாக அனுப்பப்படுகிறது.
இந்த பொருள் client க்கு தரவைத் திருப்பி அனுப்ப பயன்படுத்தப்படுகிறது மற்றும் Writable Stream இடைமுகத்தை செயல்படுத்துகிறது. பதில் பொருள் சேவையகம் கோரிக்கை செய்த client க்கு தரவை எவ்வாறு அனுப்புகிறது என்பதாகும்.
பதில் பொருளைப் பயன்படுத்துதல்
const http = require('http');
// ஒரு HTTP சேவையகத்தை உருவாக்கு
const server = http.createServer((req, res) => {
// 'res' என்பது ServerResponse பொருள்
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(8080, () => {
console.log('Server running at http://localhost:8080/');
});
பதில் பண்புகள்
| பண்பு | விளக்கம் |
|---|---|
| response.finished | பதில் முடிந்ததா என்பதைக் குறிக்கும் boolean |
| response.headersSent | தலைப்புகள் client க்கு அனுப்பப்பட்டதா என்பதைக் குறிக்கும் boolean |
| response.sendDate | true ஆக இருக்கும் போது, Date தலைப்பு ஏற்கனவே அமைக்கப்படாவிட்டால் தானாகவே உருவாக்கப்பட்டு பதிலில் அனுப்பப்படும். இயல்புநிலை: true |
| response.statusCode | client க்கு அனுப்பப்படும் நிலை குறியீடு (எ.க., 200, 404, 500) |
| response.statusMessage | client க்கு அனுப்பப்படும் நிலை செய்தி |
| response.socket | அடிப்படை socket க்கான குறிப்பு |
| response.writableEnded | response.end() அழைக்கப்பட்டதா என்பதைக் குறிக்கும் boolean |
| response.writableFinished | அனைத்து தரவும் அடிப்படை அமைப்புக்கு flush செய்யப்பட்டதா என்பதைக் குறிக்கும் boolean |
பதில் முறைகள்
| முறை | விளக்கம் |
|---|---|
| response.addTrailers(headers) | பதிலுக்கு HTTP trailing தலைப்புகளைச் சேர்க்கிறது |
| response.cork() | பதிலுக்கு எழுதப்பட்ட தரவை buffer செய்ய கட்டாயப்படுத்துகிறது |
| response.end([data[, encoding]][, callback]) | அனைத்து பதில் தலைப்புகள் மற்றும் உடல் அனுப்பப்பட்டுள்ளது என சேவையகத்திற்கு சைகை செய்கிறது |
| response.flushHeaders() | பதில் தலைப்புகளை flush செய்கிறது |
| response.getHeader(name) | வரிசையில் உள்ள ஆனால் இன்னும் அனுப்பப்படாத வெளிச்செல்லும் தலைப்பின் மதிப்பைப் பெறுகிறது |
| response.getHeaderNames() | வெளிச்செல்லும் செய்திக்கு வரிசையில் உள்ள தலைப்புகளின் பெயர்களைக் கொண்ட வரிசையைத் தரும் |
| response.getHeaders() | தற்போதைய வெளிச்செல்லும் தலைப்புகளின் shallow copy ஐத் தரும் |
| response.hasHeader(name) | name மூலம் அடையாளம் காணப்படும் தலைப்பு தற்போது அமைக்கப்பட்டால் true தரும் |
| response.removeHeader(name) | அனுப்புவதற்கு வரிசையில் உள்ள தலைப்பை அகற்றுகிறது |
| response.setHeader(name, value) | தலைப்பு பொருளுக்கு ஒரு தனி தலைப்பு மதிப்பை அமைக்கிறது |
| response.setTimeout(msecs[, callback]) | socket இன் timeout மதிப்பை அமைக்கிறது |
| response.uncork() | cork() மூலம் buffer செய்யப்பட்ட தரவை flush செய்கிறது |
| response.write(chunk[, encoding][, callback]) | பதில் உடலின் ஒரு chunk ஐ அனுப்புகிறது |
| response.writeContinue() | client க்கு HTTP/1.1 100 Continue செய்தியை அனுப்புகிறது |
| response.writeHead(statusCode[, statusMessage][, headers]) | கோரிக்கைக்கு ஒரு பதில் தலைப்பை அனுப்புகிறது |
| response.writeProcessing() | client க்கு HTTP/1.1 102 Processing செய்தியை அனுப்புகிறது |
அடிப்படை பதில் எடுத்துக்காட்டு
பல்வேறு பதில் முறைகளைப் பயன்படுத்தும் ஒரு அடிப்படை எடுத்துக்காட்டு:
const http = require('http');
// ஒரு HTTP சேவையகத்தை உருவாக்கு
const server = http.createServer((req, res) => {
// நிலை குறியீடு மற்றும் செய்தியை அமை
res.statusCode = 200;
res.statusMessage = 'OK';
// தலைப்புகளை அமை
res.setHeader('Content-Type', 'text/html');
res.setHeader('X-Powered-By', 'Node.js');
// பதில் தகவலை log செய்
console.log(`Response status: ${res.statusCode} ${res.statusMessage}`);
console.log(`Headers sent: ${res.headersSent}`);
// writeHead ஐப் பயன்படுத்தி கூடுதல் தலைப்புகளை அனுப்பு (முன்பு அமைக்கப்பட்டவற்றை மேலெழுதும்)
res.writeHead(200, {
'Content-Type': 'text/html',
'X-Custom-Header': 'Custom Value'
});
// இப்போது தலைப்புகள் அனுப்பப்பட்டதா எனச் சரிபார்க்கவும்
console.log(`Headers sent after writeHead: ${res.headersSent}`);
// chunks இல் பதில் உடலை எழுது
res.write('\n');
res.write('\n');
res.write('Node.js Response Example \n');
res.write('\n');
res.write(' Hello from Node.js!
\n');
res.write(' This response was sent using the ServerResponse object.
\n');
res.write('\n');
res.write('');
// பதிலை முடி
res.end();
// நிறைவு நிலையை log செய்
console.log(`Response finished: ${res.finished}`);
console.log(`Response writableEnded: ${res.writableEnded}`);
console.log(`Response writableFinished: ${res.writableFinished}`);
});
// சேவையகத்தைத் தொடங்கு
const PORT = 8080;
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/`);
});
பதில் தலைப்புகளை அமைத்தல்
பதில் தலைப்புகளை அமைப்பதற்கான வெவ்வேறு வழிகள்:
const http = require('http');
// HTTP சேவையகத்தை உருவாக்கு
const server = http.createServer((req, res) => {
// முறை 1: setHeader உடன் தனிப்பட்ட தலைப்புகளை அமை
res.setHeader('Content-Type', 'application/json');
res.setHeader('Cache-Control', 'max-age=3600');
res.setHeader('X-Custom-Header', 'Method 1');
// ஒரு தலைப்பு மதிப்பைப் பெறு
const contentType = res.getHeader('Content-Type');
console.log(`Content-Type header: ${contentType}`);
// ஒரு தலைப்பு உள்ளதா எனச் சரிபார்க்கவும்
console.log(`Has Cache-Control header: ${res.hasHeader('Cache-Control')}`);
// அனைத்து தலைப்பு பெயர்களையும் பெறு
console.log('Header names:', res.getHeaderNames());
// பொருளாக அனைத்து தலைப்புகளையும் பெறு
console.log('All headers:', res.getHeaders());
// ஒரு தலைப்பை அகற்று
res.removeHeader('X-Custom-Header');
console.log(`After removal, has X-Custom-Header: ${res.hasHeader('X-Custom-Header')}`);
// முறை 2: writeHead உடன் பல தலைப்புகளை அமை
res.writeHead(200, {
'Content-Type': 'application/json',
'X-Custom-Header': 'Method 2',
'X-Powered-By': 'Node.js'
});
// JSON பதிலை அனுப்பு
const responseObject = {
message: 'Headers demonstration',
headers: Object.fromEntries(
Object.entries(res.getHeaders())
),
headersSent: res.headersSent
};
res.end(JSON.stringify(responseObject, null, 2));
});
// சேவையகத்தைத் தொடங்கு
const PORT = 8080;
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/`);
});
HTTP நிலை குறியீடுகள்
வெவ்வேறு HTTP நிலை குறியீடுகளை அமைத்தல்:
const http = require('http');
const url = require('url');
// வெவ்வேறு நிலை குறியீடுகளை நிரூபிக்கும் HTTP சேவையகத்தை உருவாக்கு
const server = http.createServer((req, res) => {
// கோரிக்கை URL ஐ parse செய்
const parsedUrl = url.parse(req.url, true);
const path = parsedUrl.pathname;
// Content-Type தலைப்பை அமை
res.setHeader('Content-Type', 'text/html');
// வெவ்வேறு பாதைகளை வெவ்வேறு நிலை குறியீடுகளுடன் கையாளவும்
if (path === '/') {
// 200 OK
res.writeHead(200, 'OK');
res.end(`
HTTP Status Codes Demo
This page demonstrates different HTTP status codes.
- 200 OK (this page)
- 301 Moved Permanently
- 304 Not Modified
- 400 Bad Request
- 401 Unauthorized
- 403 Forbidden
- 404 Not Found
- 500 Internal Server Error
`);
}
else if (path === '/redirect') {
// 301 Moved Permanently
res.writeHead(301, {
'Location': '/'
});
res.end();
}
else if (path === '/not-modified') {
// 304 Not Modified
res.writeHead(304);
res.end();
}
else if (path === '/bad-request') {
// 400 Bad Request
res.writeHead(400, 'Bad Request');
res.end(`
400 Bad Request
The server could not understand the request due to invalid syntax.
`);
}
else if (path === '/unauthorized') {
// 401 Unauthorized
res.writeHead(401, {
'WWW-Authenticate': 'Basic realm="Access to the site"'
});
res.end(`
401 Unauthorized
Authentication is required but was not provided.
`);
}
else if (path === '/forbidden') {
// 403 Forbidden
res.writeHead(403, 'Forbidden');
res.end(`
403 Forbidden
The server understood the request but refuses to authorize it.
`);
}
else if (path === '/not-found') {
// 404 Not Found
res.writeHead(404, 'Not Found');
res.end(`
404 Not Found
The requested resource could not be found on this server.
`);
}
else if (path === '/server-error') {
// 500 Internal Server Error
res.writeHead(500, 'Internal Server Error');
res.end(`
500 Internal Server Error
The server has encountered a situation it doesn't know how to handle.
`);
}
else {
// இயல்புநிலை: 404 Not Found
res.writeHead(404, 'Not Found');
res.end(`
404 Not Found
The requested resource could not be found on this server.
`);
}
});
// சேவையகத்தைத் தொடங்கு
const PORT = 8080;
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/`);
});
Streaming பதில்கள்
தரவை stream செய்ய பதில் பொருளைப் பயன்படுத்துதல்:
const http = require('http');
const fs = require('fs');
const path = require('path');
// ஒரு HTTP சேவையகத்தை உருவாக்கு
const server = http.createServer((req, res) => {
const parsedUrl = new URL(req.url, 'http://localhost');
const pathname = parsedUrl.pathname;
// வெவ்வேறு பாதைகளைக் கையாளவும்
if (pathname === '/') {
// ஒரு வழக்கமான பதிலை அனுப்பு
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(`
Streaming Examples
`);
}
else if (pathname === '/stream-text') {
// ஒரு பெரிய உரை பதிலை stream செய்யவும்
res.writeHead(200, {'Content-Type': 'text/plain'});
let count = 1;
const max = 10;
// தாமதத்துடன் chunks இல் பதிலை எழுதவும்
const interval = setInterval(() => {
res.write(`Chunk ${count} of data\n`.repeat(20));
if (count >= max) {
clearInterval(interval);
res.end('\nStreaming complete!');
}
count++;
}, 500);
// client துண்டிப்பைக் கையாளவும்
req.on('close', () => {
clearInterval(interval);
console.log('Client closed connection');
});
}
else if (pathname === '/stream-file') {
// ஒரு மாதிரி கோப்பை உருவாக்கு
const filePath = path.join(__dirname, 'sample-large-file.txt');
if (!fs.existsSync(filePath)) {
const writeStream = fs.createWriteStream(filePath);
for (let i = 0; i < 10000; i++) {
writeStream.write(`Line ${i}: This is a sample line of text for streaming demonstration.\n`);
}
writeStream.end();
}
// கோப்பு புள்ளிவிவரங்களைப் பெறு
const stat = fs.statSync(filePath);
// தலைப்புகளை அமை
res.writeHead(200, {
'Content-Type': 'text/plain',
'Content-Length': stat.size
});
// read stream உருவாக்கி பதிலுக்கு pipe செய்யவும்
const fileStream = fs.createReadStream(filePath);
fileStream.pipe(res);
// கோப்பு ஸ்ட்ரீம் பிழைகளைக் கையாளவும்
fileStream.on('error', (err) => {
console.error(`Error streaming file: ${err.message}`);
res.end('Error streaming file');
});
// பதில் அனுப்பப்பட்ட பிறகு சுத்தம் செய்யவும்
res.on('finish', () => {
fs.unlink(filePath, (err) => {
if (err) console.error(`Error deleting sample file: ${err.message}`);
});
});
}
else if (pathname === '/stream-json') {
// ஒரு பெரிய JSON பதிலை stream செய்யவும்
res.writeHead(200, {'Content-Type': 'application/json'});
// JSON வரிசையைத் தொடங்கவும்
res.write('[\n');
let count = 0;
const max = 100;
let isFirst = true;
// தாமதத்துடன் JSON பொருள்களை எழுதவும்
const interval = setInterval(() => {
// முதல் உருப்படி தவிர அனைத்திற்கும் கமாவைச் சேர்க்கவும்
if (!isFirst) {
res.write(',\n');
} else {
isFirst = false;
}
// ஒரு JSON பொருளை உருவாக்கு
const obj = {
id: count,
name: `Item ${count}`,
timestamp: new Date().toISOString(),
data: `Sample data for item ${count}`
};
// பொருளை JSON ஆக எழுதவும்
res.write(JSON.stringify(obj, null, 2));
if (count >= max) {
clearInterval(interval);
// JSON வரிசையை முடிக்கவும்
res.write('\n]');
res.end();
}
count++;
}, 100);
// client துண்டிப்பைக் கையாளவும்
req.on('close', () => {
clearInterval(interval);
console.log('Client closed connection during JSON streaming');
});
}
else {
// அறியப்படாத பாதைகளைக் கையாளவும்
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end('Not Found');
}
});
// சேவையகத்தைத் தொடங்கு
const PORT = 8080;
server.listen(PORT, () => {
console.log(`Streaming server running at http://localhost:${PORT}/`);
});
சுருக்கம்
gzip அல்லது deflate உடன் பதில்களைச் சுருக்குதல்:
const http = require('http');
const zlib = require('zlib');
// சுருக்கத்துடன் ஒரு HTTP சேவையகத்தை உருவாக்கு
const server = http.createServer((req, res) => {
// Accept-Encoding தலைப்பைப் பெறு
const acceptEncoding = req.headers['accept-encoding'] || '';
// ஒரு மாதிரி பதிலை உருவாக்கு (பெரிய சரம்)
const sampleData = 'This is a sample text that will be compressed. '.repeat(1000);
// பொருத்தமான தலைப்புகளுடன் பதிலை அனுப்பும் செயல்பாடு
function sendResponse(data, encoding) {
// சுருக்கம் பயன்படுத்தப்பட்டால் Content-Encoding தலைப்பை அமை
if (encoding) {
res.setHeader('Content-Encoding', encoding);
}
res.setHeader('Content-Type', 'text/plain');
res.setHeader('Vary', 'Accept-Encoding');
res.writeHead(200);
res.end(data);
}
// client எந்த encodings ஆதரிக்கிறது எனச் சரிபார்க்கவும்
if (/\bgzip\b/.test(acceptEncoding)) {
// Client gzip ஐ ஆதரிக்கிறது
console.log('Using gzip compression');
zlib.gzip(sampleData, (err, compressed) => {
if (err) {
console.error('Gzip compression failed:', err);
sendResponse(sampleData); // சுருக்கமில்லாததற்கு fall back
} else {
sendResponse(compressed, 'gzip');
console.log(`Original size: ${sampleData.length}, Compressed size: ${compressed.length}`);
console.log(`Compression ratio: ${(compressed.length / sampleData.length * 100).toFixed(2)}%`);
}
});
} else if (/\bdeflate\b/.test(acceptEncoding)) {
// Client deflate ஐ ஆதரிக்கிறது
console.log('Using deflate compression');
zlib.deflate(sampleData, (err, compressed) => {
if (err) {
console.error('Deflate compression failed:', err);
sendResponse(sampleData); // சுருக்கமில்லாததற்கு fall back
} else {
sendResponse(compressed, 'deflate');
console.log(`Original size: ${sampleData.length}, Compressed size: ${compressed.length}`);
console.log(`Compression ratio: ${(compressed.length / sampleData.length * 100).toFixed(2)}%`);
}
});
} else if (/\bbr\b/.test(acceptEncoding)) {
// Client Brotli ஐ ஆதரிக்கிறது (Node.js பதிப்பு ஆதரித்தால்)
if (typeof zlib.brotliCompress === 'function') {
console.log('Using Brotli compression');
zlib.brotliCompress(sampleData, (err, compressed) => {
if (err) {
console.error('Brotli compression failed:', err);
sendResponse(sampleData); // சுருக்கமில்லாததற்கு fall back
} else {
sendResponse(compressed, 'br');
console.log(`Original size: ${sampleData.length}, Compressed size: ${compressed.length}`);
console.log(`Compression ratio: ${(compressed.length / sampleData.length * 100).toFixed(2)}%`);
}
});
} else {
console.log('Brotli not supported in this Node.js version');
sendResponse(sampleData); // சுருக்கமில்லாததற்கு fall back
}
} else {
// client ஆல் சுருக்கம் ஆதரிக்கப்படவில்லை
console.log('No compression used');
sendResponse(sampleData);
}
});
// சேவையகத்தைத் தொடங்கு
const PORT = 8080;
server.listen(PORT, () => {
console.log(`Compression server running at http://localhost:${PORT}/`);
});